#include "delay.h"

static u8   fac_us = 0;                                     //us延时倍乘数

/*
外部晶振如果为8MHz, STM32时钟为9倍频，72MHz,现在SysTick的时钟源选为STM32时钟的
8分频，即为9MHz.因为SysTick为倒数定时器，所以其每1/9uS就减1。
初始化中的SystemCoreClock定义于system_stm32f10x.c中，为手动定义的系统内核时钟。
SysTick->LOAD 为24位寄存器,所以,最大延时为1864000us,如果通过宏调用delay_ms，则
应当超过1864ms
*/
void delay_init()     
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //选择外部时钟  HCLK/8
    fac_us = SystemCoreClock / 8000000;                     //为系统时钟的1/8  
}

void delay_us(u32 nus)
{
    u32 temp;
    SysTick->LOAD = nus * fac_us;                           //时间加载
    SysTick->VAL = 0x00;                                    //清空计数器
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;              //开始倒数
    do{
        temp = SysTick->CTRL;                               //读取状态
    }while(temp & 0x01 && !(temp & (1 << 16)));              //等待时间到达
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭计数器
    SysTick->VAL = 0X00;                                    //清空计数器
}
































